package com.dailybule.java.mybatis.m1;

import com.dailybule.java.mybatis.m1.bean.Emp;
import com.dailybule.java.mybatis.m1.mapper.EmpMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.SneakyThrows;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    @SneakyThrows
    private static void a() {
        // 测试 调用查询方法
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession();
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        List<Emp> list = mapper.findAll();
        list.forEach(System.out::println);
        // 6. 关闭连接
        session.close();
    }

    @SneakyThrows
    private static void b1() {
        // 测试 调用查询方法
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession();
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        Emp emp = mapper.findById(7992);
        System.out.println(emp);
        // 6. 关闭连接
        session.close();
    }

    @SneakyThrows
    private static void b2() {
        // 测试 调用查询方法
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession();
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        List<Emp> list = mapper.findByJob("程序员");
        list.forEach(System.out::println);
        // 6. 关闭连接
        session.close();
    }

    @SneakyThrows
    private static void c1() {
        // 测试 调用查询方法
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession();
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        Map map = new HashMap();
        map.put("enname", "%张%");
        map.put("job", "程序员");
        List<Emp> list = mapper.findByEnnameAndJob1(map);
        list.forEach(System.out::println);
        // 6. 关闭连接
        session.close();
    }

    @SneakyThrows
    private static void c2() {
        // 测试 调用查询方法
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession();
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        Emp emp = new Emp();
        emp.setJob("程序员");
        emp.setEnname("%张%");
        List<Emp> list = mapper.findByEnnameAndJob2(emp);
        list.forEach(System.out::println);
        // 6. 关闭连接
        session.close();
    }

    @SneakyThrows
    private static void c3() {
        // 测试 调用查询方法
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession();
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        List<Emp> list = mapper.findByEnnameAndJob3("%张%", "程序员");
        list.forEach(System.out::println);
        // 6. 关闭连接
        session.close();
    }

    @SneakyThrows
    // 增删改
    public static void d1() {
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession(true);
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        Emp emp = new Emp();
        emp.setSal(7988.0);
        emp.setComm(123.0);
        emp.setEnname("刘飞");
        emp.setJob("歌手");
        emp.setMgr(7964);
        emp.setDeptno(10);
        mapper.save(emp);
        // 6. 提交事务
        session.commit();
        // 7. 关闭连接
        session.close();
    }

    @SneakyThrows
    public static void d2(){
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession(true);
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        Emp emp = new Emp();
        emp.setSal(9998.0);
        emp.setEnname("闫帅");
        emp.setJob("歌手");
        emp.setEmpno(8014);
        mapper.update(emp);
        // 6. 提交事务
        session.commit();
        // 7. 关闭连接
        session.close();
    }
    @SneakyThrows
    public static void d3(){
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession(true);
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        mapper.delete(8005);
        // 7. 关闭连接
        session.close();
    }

    // 分页效果
    @SneakyThrows
    public static void e(){
        // 1. 加载配置文件
        InputStream in = Resources.getResourceAsStream("config.xml");
        // 2. 产生会话工厂
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        // 3. 产生会话
        SqlSession session = ssf.openSession(true);
        // 4. 获取到mapper的`对象`
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        // 5. 调用方法
        // 5.1 分页配置
        PageHelper.startPage(1,10);
        // 5.2 调用方法
        List<Emp> list = mapper.findAll();
        // 5.3 包装分页数据
        PageInfo<Emp> pageInfo = new PageInfo<>(list);
        System.out.println(pageInfo);
        // 7. 关闭连接
        session.close();
    }
    public static void main(String[] args) {
        e();
    }
}